/*
 * Copyright 2007-2022 Enrico Boldrini, Lorenzo Bigagli This file is part of
 * CheckboxTree. CheckboxTree is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or (at your
 * option) any later version. CheckboxTree is distributed in the hope that it
 * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
 * Public License for more details. You should have received a copy of the GNU
 * General Public License along with CheckboxTree; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA
 */
package com.element.ui.tree.checkboxtree;

import javax.swing.*;
import javax.swing.tree.TreeCellRenderer;
import java.awt.*;

/**
 * The renderer for a cell in a CheckboxTree.
 *
 * @author bigagli
 */
public interface CheckboxTreeCellRenderer extends TreeCellRenderer {

	/**
	 * This method is redeclared just to underline that the implementor has to
	 * properly display the checking/graying state of <code>value</code>. This
	 * should go in the method parameters, but would imply changes to Swing
	 * classes that were considered unpractical. For example in
	 * DefaultCheckboxTreeCellRenderer the following code is used to get the
	 * checking/graying states:
	 *
	 * <pre>
	 * TreeCheckingModel checkingModel = ((CheckboxTree) tree).getCheckingModel();
	 *
	 * TreePath path = tree.getPathForRow(row);
	 *
	 * boolean enabled = checkingModel.isPathEnabled(path);
	 *
	 * boolean checked = checkingModel.isPathChecked(path);
	 *
	 * boolean greyed = checkingModel.isPathGreyed(path);
	 * </pre>
	 * <p>
	 * You could use a QuadristateCheckbox to properly renderer the states (as
	 * in DefaultCheckboxTreeCellRenderer).
	 *
	 * @see TreeCellRenderer#getTreeCellRendererComponent
	 */
	Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row,
	                                       boolean hasFocus);

	/**
	 * Returns whether the specified relative coordinates insist on the intended
	 * checkbox control. It is used by the CheckboxTree mouse listener to figure
	 * out whether to toggle a node or not.
	 */
	boolean isOnHotspot(int x, int y);

}
